{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "00fc64b9-38da-42f1-8280-f45d479cdca3",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 简单的跃迁函数\n",
    "def step_function(x):\n",
    "    if x > 0:\n",
    "        return 1\n",
    "    return 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a3eb03cd-fc42-48a2-a10e-143654a14ccd",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 支持NumPy数组x的实现\n",
    "def step_function(x):\n",
    "    y = x > 0 # array([False, True, True], dtype=bool)\n",
    "    return y.astype(np.int) # astype()方法转换NumPy数组类型:y = array([0,1,1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "5b65f0d7-9b72-4d1e-ad3a-8d968fbc0174",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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2lqVlJTo3Xffdbska7z99tvauHGj7r//frdLmfEGBgYUi8UUCARStgcCAfX19blUlfc5jqP6+npddNFFKi4udrscT/r1r3+t119/Xa+99prbpRiPlRED3XPPPfL5fIf92Lt3rzZu3KhIJKKGhga3S56xpvpaH6qnp0ff+ta39J3vfEc1NTUuVe49Pp8v5XPHccZtw9Fzyy236I9//KOefPJJt0vxpO7ubt122216/PHHlZ2d7XY5xqNnxEADAwMaGBg47D6nn366vvvd7+p3v/tdyht2LBZTZmamvve97+mXv/zlsS51xpvqa514M+np6dGyZcu0dOlSbdu2TRkZ5PkjNTo6qhNPPFFPPfWUrr766uT22267TV1dXdq5c6eL1XnTrbfequeff167du1SYWGh2+V40vPPP6+rr75amZmZyW2xWEw+n08ZGRkaGRlJ+TfbEUZmsHA4rEgkkvy8p6dHl19+uZ5++mktXbpUixYtcrE67/nggw+0bNkyBYNBPf7447yRHEVLly5VMBhUc3NzcttXvvIVffvb36aB9ShyHEe33nqrnnvuOf3hD3/QWWed5XZJnjU8PKz33nsvZduNN96oL3/5y/rxj3/MpbHPoGdkBlu8eHHK5yeffLIk6cwzzySIHGU9PT26+OKLtXjxYt1333366KOPkv+2YMECFyvzhvr6el1//fUqKSlRaWmpNm/erHA4rNraWrdL85SVK1fqiSee0G9+8xvNmTMn2ZOTm5ur2bNnu1ydt8yZM2dc4DjppJM0d+5cgsgECCPAFOzYsUNvvfWW3nrrrXFBj8XFI1dZWanBwUGtX79evb29Ki4uVltbmwoKCtwuzVMSt05ffPHFKdsfffRRrVix4vgXBBzEZRoAAOAquu8AAICrCCMAAMBVhBEAAOAqwggAAHAVYQQAALiKMAIAAFxFGAEAAK4ijAAAAFcRRgAAgKsIIwAAwFWEEQAA4CrCCAAAcNX/B8Cmfri/kqJcAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 跃迁函数的图形\n",
    "import numpy as np\n",
    "import matplotlib.pylab as plt\n",
    "\n",
    "def step_function(x):\n",
    "    return np.array(x > 0, dtype = np.int64) # 版本更新后需要指定位数int32或者int64\n",
    "\n",
    "x = np.arange(-5.0, 5.0, 0.1)\n",
    "y = step_function(x)\n",
    "\n",
    "plt.plot(x, y)\n",
    "plt.ylim(-0.1, 1.1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "12cfe221-bdd2-4da2-a7e2-1809fd09c22d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABHLElEQVR4nO3dd3hUZf7+8fek90AqCYQQegk1SCiighrFivoVLCsW9Ce7KiKWFV0b625c29oW1BV17djAhoXVFVFAIfTeSSAJIQEy6ZPMnN8fA4mRJCYhyZnM3K/rmitnTp4z88nAmbnnOc95jsUwDAMRERERk3iZXYCIiIh4NoURERERMZXCiIiIiJhKYURERERMpTAiIiIiplIYEREREVMpjIiIiIipFEZERETEVD5mF9AYDoeD7OxsQkNDsVgsZpcjIiIijWAYBkVFRcTHx+PlVX//R7sII9nZ2SQkJJhdhoiIiDRDVlYWXbp0qff37SKMhIaGAs4/JiwszORqREREpDGsVisJCQnVn+P1aRdh5PihmbCwMIURERGRdub3hlhoAKuIiIiYSmFERERETKUwIiIiIqZSGBERERFTKYyIiIiIqRRGRERExFQKIyIiImIqhRERERExlcKIiIiImEphREREREylMCIiIiKmUhgRERERUymMiIiIiKkURkRERMRUCiMiIiJiKoURERERMZXCiIiIiJhKYURERERMpTAiIiIiplIYEREREVMpjIiIiIipFEZERETEVAojIiIiYqomh5EffviBCy+8kPj4eCwWCwsXLvzdbZYsWUJKSgoBAQF0796dF198sTm1ioiIiBtqchgpKSlh8ODBvPDCC41qv2fPHs477zzGjh3LmjVruO+++5g+fTofffRRk4sVERER9+PT1A0mTJjAhAkTGt3+xRdfpGvXrjzzzDMA9OvXj1WrVvHkk09y2WWXNfXpRURExM00OYw01fLly0lLS6u17pxzzmHevHlUVlbi6+t7wjYVFRVUVFRU37dara1dpoi4mspyWPEvKD4EnVNg0OXO9VUVsPih+rfrNBCGXu1cNgz4alb9baP7wPDra+5/8xewV9XdNqI7pP6/mvvfzgZbad1tw7vA6Ftr7n//GJQdrbttSAyMnVlzf+lTzr+5LoEd4Yw/19xf9jwUHqi7rV8wnPlAzf2fX4LDe+pu6+0LaX+tub/q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aWDtMLLuHTi8u+62ET1qh5ENH8DBjXW3DY2rHUY2LYD9v9Td9sPrYcZGhRERD9OsAay/PTXUMIwGTxetq31d64+bNWsWM2fOrL5vtVpJSEhoTqm/r1caBEfX/3u/4Jrl7uNq3/+tgA41y91OdX7I1efXz5kwEsbeWX/bsF8Fts4pDbftkFizHDeo4bYRPWqWo/s23Damb81yZM+G23YaWLPcsVvDbeOH1SyHxTfcNiG1Zjk4puG2iWNqlgM7Nv5x/YJ/p96hNcs+AQ23jU2uWbZ4Ndw2um/t+6feUX/PSET32vdH3eoMRnUJ71L7furNYCuuu21Ip9r3h0+FssN1tw2MqH1/2BRnmKyLf2jt+0OudAbhusT0hw6ttK+LiMtq0pgRm81GUFAQH3zwAZdcckn1+ttvv521a9eyZMmSE7Y57bTTGDp0KM8++2z1ugULFjBp0iRKS0vrPEzzW601ZkRERERaT2M/v5t02oafnx8pKSksXlx7fMPixYsZPXp0nduMGjXqhPbffPMNw4cPb1QQEREREffW5HNIZ86cySuvvMKrr77Kli1buOOOO8jMzKyeN2TWrFlMmVJz7HvatGns27ePmTNnsmXLFl599VXmzZvHXXfd1XJ/hYiIiLRbTR4zMnnyZAoKCpg9ezY5OTkkJyezaNEiEhOdYxVycnLIzKwZKZ+UlMSiRYu44447+Ne//kV8fDzPPfec6XOMiIiIiGto8jwjZtCYERERkfanVcaMiIiIiLQ0hRERERExlcKIiIiImEphREREREylMCIiIiKmUhgRERERUymMiIiIiKkURkRERMRUCiMiIiJiKoURERERMZXCiIiIiJhKYURERERMpTAiIiIiplIYEREREVMpjIiIiIipFEZERETEVAojIiIiYiqFERERETGVwoiIiIiYSmFERERETKUwIiIiIqZSGBERERFTKYyIiIiIqXzMLqAxDMMAwGq1mlyJiIiINNbxz+3jn+P1aRdhpKioCICEhASTKxEREZGmKioqIjw8vN7fW4zfiysuwOFwkJ2dTWhoKBaLxexyTGe1WklISCArK4uwsDCzy3Freq3bjl7rtqPXuu14+mttGAZFRUXEx8fj5VX/yJB20TPi5eVFly5dzC7D5YSFhXnkf24z6LVuO3qt245e67bjya91Qz0ix2kAq4iIiJhKYURERERMpTDSDvn7+/PQQw/h7+9vdiluT69129Fr3Xb0WrcdvdaN0y4GsIqIiIj7Us+IiIiImEphREREREylMCIiIiKmUhgRERERUymMuImKigqGDBmCxWJh7dq1Zpfjdvbu3cvUqVNJSkoiMDCQHj168NBDD2Gz2cwuzW3MmTOHpKQkAgICSElJYenSpWaX5HbS09M55ZRTCA0NJSYmhokTJ7Jt2zazy/II6enpWCwWZsyYYXYpLklhxE3cc889xMfHm12G29q6dSsOh4OXXnqJTZs28c9//pMXX3yR++67z+zS3ML8+fOZMWMG999/P2vWrGHs2LFMmDCBzMxMs0tzK0uWLOGWW25hxYoVLF68mKqqKtLS0igpKTG7NLe2cuVKXn75ZQYNGmR2KS5Lp/a6gS+//JKZM2fy0UcfMWDAANasWcOQIUPMLsvtPfHEE8ydO5fdu3ebXUq7l5qayrBhw5g7d271un79+jFx4kTS09NNrMy9HTp0iJiYGJYsWcJpp51mdjluqbi4mGHDhjFnzhweffRRhgwZwjPPPGN2WS5HPSPt3MGDB7npppt48803CQoKMrscj1JYWEhERITZZbR7NpuNjIwM0tLSaq1PS0tj2bJlJlXlGQoLCwH0/7gV3XLLLZx//vmcddZZZpfi0trFhfKkboZhcN111zFt2jSGDx/O3r17zS7JY+zatYvnn3+ep556yuxS2r38/HzsdjuxsbG11sfGxpKbm2tSVe7PMAxmzpzJqaeeSnJystnluKX33nuP1atXs3LlSrNLcXnqGXFBDz/8MBaLpcHbqlWreP7557FarcyaNcvsktutxr7Wv5adnc25557L5Zdfzo033mhS5e7HYrHUum8YxgnrpOXceuutrF+/nnfffdfsUtxSVlYWt99+O2+99RYBAQFml+PyNGbEBeXn55Ofn99gm27dunHFFVfw2Wef1XrDttvteHt7c/XVV/Of//yntUtt9xr7Wh9/M8nOzmbcuHGkpqby+uuv4+WlPH+ybDYbQUFBfPDBB1xyySXV62+//XbWrl3LkiVLTKzOPd12220sXLiQH374gaSkJLPLcUsLFy7kkksuwdvbu3qd3W7HYrHg5eVFRUVFrd95OoWRdiwzMxOr1Vp9Pzs7m3POOYcPP/yQ1NRUunTpYmJ17ufAgQOMGzeOlJQU3nrrLb2RtKDU1FRSUlKYM2dO9br+/ftz8cUXawBrCzIMg9tuu40FCxbw/fff06tXL7NLcltFRUXs27ev1rrrr7+evn378uc//1mHxn5DY0basa5du9a6HxISAkCPHj0URFpYdnY2Z5xxBl27duXJJ5/k0KFD1b/r1KmTiZW5h5kzZ3LNNdcwfPhwRo0axcsvv0xmZibTpk0zuzS3csstt/DOO+/wySefEBoaWj0mJzw8nMDAQJOrcy+hoaEnBI7g4GAiIyMVROqgMCLSCN988w07d+5k586dJwQ9dS6evMmTJ1NQUMDs2bPJyckhOTmZRYsWkZiYaHZpbuX4qdNnnHFGrfWvvfYa1113XdsXJHKMDtOIiIiIqTT6TkREREylMCIiIiKmUhgRERERUymMiIiIiKkURkRERMRUCiMiIiJiKoURERERMZXCiIiIiJhKYURERERMpTAiIiIiplIYEREREVMpjIiIiIip/j9QZUwG43v8CQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# sigmoid函数的实现\n",
    "def sigmoid(x):\n",
    "    return 1/(1 + np.exp(-x))\n",
    "\n",
    "y1 = sigmoid(x)\n",
    "y2 = step_function(x)\n",
    "plt.plot(x, y1, label=\"sigmoid函数\") #x = np.arange(-5.0, 5.0, 0.1)\n",
    "plt.plot(x, y2, linestyle = \"--\", label=\"阶跃函数\")\n",
    "plt.ylim(-0.1, 1.1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "4cc747df-fe71-432e-bf5e-831f11a86ce4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGdCAYAAABO2DpVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABX50lEQVR4nO3dd3wUdf7H8dfupmfTe0jovVcR8QQOREE9EAvnz1Ox3emholg49ZQEC3enWE4PLJyAvYPlLCDSpEkHpfcWSALpZbPt98fCQiSBhJRJeT8fj31kZva7M+8sIfvJd2a+X5Pb7XYjIiIiUg3MRgcQERGRhkOFhYiIiFQbFRYiIiJSbVRYiIiISLVRYSEiIiLVRoWFiIiIVBsVFiIiIlJtVFiIiIhItfGp7QO6XC4OHz5MSEgIJpOptg8vIiIi58HtdpOXl0diYiJmc/n9ErVeWBw+fJjk5OTaPqyIiIhUgwMHDpCUlFTu87VeWISEhACeYKGhobV9eBERETkPubm5JCcnez/Hy1PrhcXJ0x+hoaEqLEREROqZc13GUKmLN1NSUjCZTKUe8fHxVQooIiIiDUeleyw6derEDz/84F23WCzVGkhERETqr0oXFj4+PuqlEBERkTJVurDYsWMHiYmJ+Pv707dvX5599llatmxZbnubzYbNZvOu5+bmnvMYTqcTu91e2Wgi9ZLFYsHHx0e3X4tIg1CpwqJv3768/fbbtG3blqNHj/L0009z0UUX8euvvxIVFVXmayZPnkxqamqFj5Gfn8/Bgwdxu92ViSZSrwUFBZGQkICfn5/RUUREqsTkrsIneEFBAa1ateKRRx5h/PjxZbYpq8ciOTmZnJycM+4KcTqd7Nixg6CgIGJiYvQXnDR4brebkpISMjIycDqdtGnT5qwDz4iIGCU3N5ewsLAyP79PV6XbTYODg+nSpQs7duwot42/vz/+/v4V2p/dbsftdhMTE0NgYGBVoonUG4GBgfj6+rJv3z5KSkoICAgwOpKIyHmr0p9GNpuNLVu2kJCQUF15gHPfIyvS0KiXQkQaikr9NnvooYdYtGgRe/bsYeXKlVx77bXk5uZyyy231FQ+ERERqUcqVVgcPHiQG264gXbt2jFq1Cj8/PxYsWIFzZo1q6l89d6YMWMYOXKk0TEAaN68OS+99NJZ25hMJubMmVMreUREpOGp1DUWH374YU3laLBefvnlOnOHy6pVqwgODjY6hoiI1IACewFzds5hdLvR+JhrfcYOL53YrWFhYWGEh4cbHQOAmJgYgoKCjI4hIiI1wOa08XPazzyy+BFDc6iwqCaffvopXbp0ITAwkKioKIYMGUJBQcEZp0Ly8vK48cYbCQ4OJiEhgRdffJGBAwdy//33e9s0b96cp59+mptvvhmr1UqzZs344osvyMjIYMSIEVitVrp06cLq1atLZfjss8/o1KkT/v7+NG/enClTppR6/renQnbs2MEll1xCQEAAHTt2ZN68eTXx1oiISC2IDIjkpUEv8cSFTxiao04XFm63m8IShyGPypy+SEtL44YbbuC2225jy5YtLFy4kFGjRpW5j/Hjx7N06VK+/PJL5s2bx5IlS1i7du0Z7V588UX69+/PunXruOKKK7jpppu4+eab+dOf/sTatWtp3bo1N998s/cYa9as4frrr+ePf/wjmzZtIiUlhSeeeIKZM2eWmdnlcjFq1CgsFgsrVqzgtddeY8KECRX+nkVEpG44/bPGZDIRERBhYBoDpk2vjCK7k45Pfm/IsTdPuowgv4q9PWlpaTgcDkaNGuW9kLVLly5ntMvLy2PWrFm8//77DB48GIAZM2aQmJh4Rtvhw4fzl7/8BYAnn3ySadOm0adPH6677joAJkyYQL9+/Th69Cjx8fG88MILDB48mCee8FSqbdu2ZfPmzTz33HOMGTPmjP3/8MMPbNmyhb1795KUlATAs88+y7Bhwyr0PYuISN0wbcM09uftZ0KfCYYXFVDHeyzqi27dujF48GC6dOnCddddx5tvvklWVtYZ7Xbv3o3dbueCCy7wbgsLC6Ndu3ZntO3atat3OS4uDihdrJzclp6eDsCWLVvo379/qX3079+fHTt24HQ6z9j/li1baNq0qbeoAOjXr1+Fvl8REakbsoqzeOuXt/jf7v/x85GfjY4D1PEei0BfC5snXWbYsSvKYrEwb948li1bxty5c3nllVd4/PHHWblyZal2J7urfjsAWFmnTHx9fb3LJ9uXtc3lcnn3UZH9nu05DUwmIlK/RAREMPPymXy35zuGNhtqdBygjhcWJpOpwqcjjGYymejfvz/9+/fnySefpFmzZsyePbtUm1atWuHr68vPP/9McnIy4Bl7fceOHQwYMKBKx+/YsSM//fRTqW3Lli2jbdu2WCxnFkkdO3Zk//79HD582HsqZvny5VXKICIita9zdGc6R3c2OoZX/fjUruNWrlzJ/PnzGTp0KLGxsaxcuZKMjAw6dOjAxo0bve1CQkK45ZZbePjhh4mMjCQ2NpaJEydiNpur3Fvw4IMP0qdPH5566ilGjx7N8uXLefXVV5k6dWqZ7YcMGUK7du24+eabmTJlCrm5uTz++ONVyiAiIrXjSMERCu2FtAxvaXSUM+gai2oQGhrK4sWLGT58OG3btuXvf/87U6ZMKfNCyBdeeIF+/fpx5ZVXMmTIEPr370+HDh2qPPFUz549+fjjj/nwww/p3LkzTz75JJMmTSrzwk3wzE0xe/ZsbDYbF1xwAXfccQfPPPNMlTKIiEjNc7vdTFo+iWu/upavdn1ldJwzVGna9PNxtmlXi4uL2bNnDy1atGg0MzwWFBTQpEkTpkyZwu233250HDFIY/zZF5Hz8+2eb3lk8SP4mn359KpPa63XolamTZfKW7duHVu3buWCCy4gJyeHSZMmATBixAiDk4mISF2XXZzNP37+BwB/7vrnOnkqRIWFAZ5//nm2bduGn58fvXr1YsmSJURHRxsdS0RE6rjnVj/H8eLjtA5vze2d62YvtwqLWtajRw/WrFljdAwREalnlh1expe7vsSEiYn9JuJr8T33iwygizdFRETquEJ7IZOWe06d39D+BrrHdjc20FmosBAREanjpq6fyqH8Q8QHx3Nfz/uMjnNWKixERETqsF8zf+WdLe8A8MSFTxDsG2xworNTYSEiIlJH2V12nlz2JC63i2EthnFJ0iVGRzonFRYiIiJ11KxfZ7E9azth/mFM6DPB6DgVosJCRESkDsoqzuL1Da8D8EifR4gKjDI4UcWosGhg5syZQ+vWrbFYLNx///2GZhk4cKDhGURE6quIgAjeGPoGo9uN5qqWVxkdp8I0jkUNGzNmDNnZ2cyZM6dWjveXv/yFW2+9lfvuu4+QkJBaOebChQsZNGgQWVlZhIeHe7d//vnnpaZ6FxGRyukR24MesT2MjlEpKiwakPz8fNLT07nsssu8U6EbKTIy0ugIIiL1TmZRJoX2QpqGNjU6ynnRqZBq8Omnn9KlSxcCAwOJiopiyJAhFBQUkJKSwqxZs/jiiy8wmUyYTCYWLlwIwKFDhxg9ejQRERFERUUxYsQI9u7d693nmDFjGDlyJKmpqcTGxhIaGspf/vIXSkpKysywcOFCbw/F73//e++xUlJS6N69e6m2L730Es2bNz/jWM8//zwJCQlERUUxduxY7Ha7t43NZuORRx4hOTkZf39/2rRpw3//+1/27t3LoEGDAIiIiMBkMnlnVP3tqZCsrCxuvvlmIiIiCAoKYtiwYezYscP7/MyZMwkPD+f777+nQ4cOWK1WLr/8ctLS0ir5LyIiUn89s+IZRn05iv/t/p/RUc5L/SgsSgrKf9iLK9G2qGJtKyEtLY0bbriB2267jS1btrBw4UJGjRqF2+3moYce4vrrr/d+OKalpXHRRRdRWFjIoEGDsFqtLF68mJ9++sn7IXp64TB//ny2bNnCggUL+OCDD5g9ezapqall5rjooovYtm0bAJ999pn3WBW1YMECdu3axYIFC5g1axYzZ85k5syZ3udvvvlmPvzwQ/7973+zZcsWXnvtNaxWK8nJyXz22WcAbNu2jbS0NF5++eUyjzFmzBhWr17Nl19+yfLly3G73QwfPrxUAVNYWMjzzz/PO++8w+LFi9m/fz8PPfRQhb8PEZH6rMhRRJ49D6fLSevw1kbHOS/141TIs2fp1m8zFG785NT6c63BXlh222YXw62nVYAvdYHCY2e2S8mpcLS0tDQcDgejRo2iWbNmAHTp0sX7fGBgIDabjfj4eO+2d999F7PZzPTp0zGZTADMmDGD8PBwFi5cyNChQwHw8/PjrbfeIigoiE6dOjFp0iQefvhhnnrqKczm0jWhn58fsbGxgOcUxOnHq4iIiAheffVVLBYL7du354orrmD+/PnceeedbN++nY8//ph58+YxZMgQAFq2PDWj3slTHrGxsaWusTjdjh07+PLLL1m6dKm34HnvvfdITk5mzpw5XHfddQDY7XZee+01WrVqBcA999zjnQFWRKShC/QJ5M1L32TL8S20i2xndJzzUj96LOqwbt26MXjwYLp06cJ1113Hm2++SVZW1llfs2bNGnbu3ElISAhWqxWr1UpkZCTFxcXs2rWr1L6DgoK86/369SM/P58DBw5U+/fRqVMnLBaLdz0hIYH09HQA1q9fj8ViYcCAAee9/y1btuDj40Pfvn2926KiomjXrh1btmzxbgsKCvIWFb/NISLSGJhMJjpGdTQ6xnmrHz0Wjx0u/zmTpfT6wzvP0vY3ddT9m84/0wkWi4V58+axbNky5s6dyyuvvMLjjz/OypUradGiRZmvcblc9OrVi/fee++M52JiYs55zJO9HBVhNptxu92ltp1+6uGk3969YTKZcLlcgKfXpap+m+H07ad/P2XlKO+1IiINxaojq/h2z7c80OsBQvxq546+mlI/eiz8gst/+AZUom1gxdpWkslkon///qSmprJu3Tr8/PyYPXu25xB+fjidzlLte/bsyY4dO4iNjaV169alHmFhYd52GzZsoKjo1HUhK1aswGq1kpSUVOFsMTExHDlypNSH8/r16yv1/XXp0gWXy8WiRYvKfN7Pzw/gjO/zdB07dsThcLBy5UrvtmPHjrF9+3Y6dOhQqTwiIg2JzWlj0vJJfLL9E97Y+IbRcaqsfhQWddjKlSt59tlnWb16Nfv37+fzzz8nIyPD+2HZvHlzNm7cyLZt28jMzMRut3PjjTcSHR3NiBEjWLJkCXv27GHRokWMGzeOgwcPevddUlLC7bffzubNm/n222+ZOHEi99xzzxnXV5zNwIEDycjI4F//+he7du3iP//5D99++22lvsfmzZtzyy23cNtttzFnzhz27NnDwoUL+fjjjwFo1qwZJpOJr7/+moyMDPLz88/YR5s2bRgxYgR33nknP/30Exs2bOBPf/oTTZo0YcSIEZXKIyLSkLy+4XX25u4lJjCGO7veaXScKlNhUUWhoaEsXryY4cOH07ZtW/7+978zZcoUhg0bBsCdd95Ju3bt6N27NzExMSxdupSgoCAWL15M06ZNGTVqFB06dOC2226jqKiI0NBQ774HDx5MmzZtuOSSS7j++uu56qqrSElJqVS+Dh06MHXqVP7zn//QrVs3fv755/O6y2LatGlce+21/PWvf6V9+/bceeedFBR47qBp0qQJqamp/O1vfyMuLo577rmnzH3MmDGDXr16ceWVV9KvXz/cbjfffPONBtESkUZr2/FtzPhlBgCP9X2MUL/Qc7yi7jO5a/kEdm5uLmFhYeTk5JT6EAUoLi5mz549tGjRgoCAgHL20DjU9oidYiz97Is0Pk6Xkxu/uZFfj/3KkKZDeHHQi0ZHOquzfX6fTj0WIiIiBnhvy3v8euxXQnxDeLTvo0bHqTYqLERERGrZwbyDvLr+VQDG9x5PbFCswYmqT/243bQROn3USxERaTjcbjdPrXiKIkcRveN6M6rNKKMjVSv1WIiIiNSir3Z/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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def relu(x):\n",
    "    return np.maximum(0, x)\n",
    "\n",
    "y3 = relu(x)\n",
    "plt.plot(x, y1, label=\"sigmoid\") #x = np.arange(-5.0, 5.0, 0.1)\n",
    "plt.plot(x, y2, linestyle = \"--\", label=\"step function\")\n",
    "plt.plot(x, y3, linestyle = \"-.\", label=\"Rectified Linear Unit\")\n",
    "plt.ylim(-0.1, 5.1)\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "d69f4096-28f9-4ad8-9d5f-dc606ebae133",
   "metadata": {},
   "outputs": [],
   "source": [
    "# softmax函数\n",
    "def softmax(a):\n",
    "    c = np.max(a)\n",
    "    exp_a = np.exp(a - c) # 溢出对策\n",
    "    sum_exp_a = np.sum(exp_a)\n",
    "    y = exp_a / sum_exp_a\n",
    "    return y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "01720c9d-9c8e-4097-aada-9b67934ac821",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.01821127 0.24519181 0.73659691]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([0.3, 2.9, 4.0])\n",
    "y = softmax(a)\n",
    "print(y) # [0.01821127 0.24519181 0.73659691]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "7c11520b-18f8-4304-aa66-a123ddf63d71",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sum(y) # 因为输出总和为1是softmax函数的一个重要性质,所以可以把输出解释为“概率”"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "d241d902-89ac-48e0-b572-7cf943a09bed",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys, os\n",
    "sys.path.append(os.pardir) # 为了导入父目录中的文件而进行的设定\n",
    "from dataset.mnist import load_mnist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "e52eaed9-2523-49e7-89ef-164a7a7ecf5f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 第一次调用会花费几分钟\n",
    "(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "506159c0-737d-494b-bcce-efff8b639962",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000, 784)\n"
     ]
    }
   ],
   "source": [
    "# 输出各个数据的形状\n",
    "print(x_train.shape) # (60000, 784)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "a6e1e71b-669d-404d-a8d6-d3dea1f8a724",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000,)\n"
     ]
    }
   ],
   "source": [
    "print(t_train.shape) # (60000,)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "b14b056a-fcd2-4c51-86b4-91abfb14bc5a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 784)\n"
     ]
    }
   ],
   "source": [
    "print(x_test.shape) # (10000, 784)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "d0cffad5-d3e4-4943-bb96-ac4b47e31c23",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "print(t_test.shape) # (10000,)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "16be9716-f182-4376-a793-598a52a8b7bb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5\n"
     ]
    }
   ],
   "source": [
    "# 图像的显示使用PIL(Python Image Library)模块\n",
    "import sys, os\n",
    "sys.path.append(os.pardir)\n",
    "import numpy as up\n",
    "from dataset.mnist import load_mnist\n",
    "from PIL import Image\n",
    "\n",
    "def img_show(img):\n",
    "    pil_img = Image.fromarray(np.uint8(img)) # 把保存为NumPy数组的图像数据转换为PIL用的数据对象\n",
    "    pil_img.show()\n",
    "\n",
    "# load_mnist函数中：\n",
    "# normalize设置是否将输入图像正规化为0.0~1.0的值\n",
    "# flatten设置是否展开输入图像(变成一维数组)\n",
    "# one_hot_label设置是否将标签保存为one_hot表示(one-hot representation).one-hot表示是仅正确解标签为1,其余为0 如:[0,0,1,0,0,0,0,0,0,0] 为False时存储为2\n",
    "(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)\n",
    "img = x_train[0]\n",
    "label = t_train[0]\n",
    "print(label) # 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "5a29ce6e-4732-42a4-8418-5ba0f8c2819c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(784,)\n",
      "(28, 28)\n"
     ]
    }
   ],
   "source": [
    "print(img.shape) # (784,)\n",
    "img = img.reshape(28, 28) # 把图像的形状变成原来的尺寸\n",
    "print(img.shape) # (28,28)\n",
    "\n",
    "img_show(img)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "6549f406-00b0-4f2e-a615-fe59353568a8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# pickle是Python的一个标准库模块(无需额外安装),用于实现数据的序列化和反序列化.\n",
    "# 它的主要功能是将Python对象(如列表、字典、类实力等)转换为字节流(序列化,即\"腌制\"),或者从字节流重新恢复为Python对象(反序列化,即\"解腌\")\n",
    "import pickle\n",
    "\n",
    "# 下面三个函数get_data() init_network() predict()的代码在ch03/neuralnet_mnist.py中已有\n",
    "# Python有pickle这个便利的功能,其可以将程序运行中的对象保存为文件,如果加载保存过的pickle文件, 可以立刻复原之前程序运行中的对象\n",
    "# 用于读入MNIST数据集的load_mnist()函数内部也使用了pickle功能\n",
    "\n",
    "\n",
    "# 加载MNIST数据集\n",
    "# 功能:从MNIST数据集中加载测试图像(x_test)和测试标签(t_test)\n",
    "#      忽略训练数据(因为这里只需要训练好的模型做预测)\n",
    "def get_data():\n",
    "    # load_mnist函数以\"(训练图像, 训练标签), (测试图像, 测试标签)\"的形式返回读入的MNIST数据\n",
    "    (x_train, t_train), (x_test, t_test) = \\\n",
    "        load_mnist(normalize=True, flatten=True, one_hot_label=False)\n",
    "    return x_test, t_test\n",
    "\n",
    "\n",
    "# 加载预训练的网络权重\n",
    "# 功能:init_network()会读入保存在pickle文件sample_weight.pkl中的学习到的权重参数\n",
    "#      这个文件中以字典变量的形式保存了权重和偏置参数\n",
    "#      文件是通过pickle序列化保存的字典,包含网络各层的参数\n",
    "def init_network():\n",
    "    with open(\"./ch03/sample_weight.pkl\",\"rb\") as f:\n",
    "        network = pickle.load(f)\n",
    "    return network\n",
    "\n",
    "\n",
    "# 加载预训练的网络权重\n",
    "# 功能:从文件sample_weight.pkl中加载预训练的神经网络权重和偏置参数\n",
    "#     文件是通过pickle序列化保存的字典,包含网络各层的参数\n",
    "# network = {\n",
    "#    'W1': W1,  # 第一层权重 (784, 50)\n",
    "#    'b1': b1,  # 第一层偏置 (50,)\n",
    "#    'W2': W2,  # 第二层权重 (50, 100)\n",
    "#    'b2': b2,  # 第二层偏置 (100,)\n",
    "#    'W3': W3,  # 第三层权重 (100, 10)\n",
    "#    'b3': b3   # 第三层偏置 (10,)\n",
    "#}\n",
    "def predict(network, x):\n",
    "    W1, W2, W3 = network['W1'], network['W2'], network['W3']\n",
    "    b1, b2, b3 = network['b1'], network['b2'], network['b3']\n",
    "\n",
    "    a1 = np.dot(x, W1) + b1      # 第一层加权和\n",
    "    z1 = sigmoid(a1)             # 第一层激活函数\n",
    "    a2 = np.dot(z1, W2) + b2     # 第二层加权和\n",
    "    z2 = sigmoid(a2)             # 第二层激活函数\n",
    "    a3 = np.dot(z2, W3) + b3     # 输出层加权和\n",
    "    y = softmax(a3)              # 输出层Softmax归一化\n",
    "\n",
    "    return y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "17653409-2cbd-43ef-984f-70ffd19d266e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy:0.9352\n"
     ]
    }
   ],
   "source": [
    "x, t = get_data()\n",
    "network = init_network()\n",
    "\n",
    "accuracy_cnt = 0\n",
    "for i in range (len(x)):\n",
    "    y = predict(network, x[i])\n",
    "    p = np.argmax(y)             # 获取概率最高的元素的索引\n",
    "    if p == t[i]:\n",
    "        accuracy_cnt += 1\n",
    "\n",
    "print(\"Accuracy:\" + str(float(accuracy_cnt) / len(x))) # 0.9352"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "d63e0c13-7590-4c73-934a-94ee990889f8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy0.9352\n"
     ]
    }
   ],
   "source": [
    "# 批处理方法\n",
    "batch_size = 100\n",
    "accuracy_cnt = 0\n",
    "\n",
    "# 首先是range()函数.range()函数若指定为range(start, end),则会生成一个由start到end-1之间的整数构成的列表.\n",
    "for i in range(0, len(x), batch_size): \n",
    "    # x[i:i+batch_size]从输入数据中抽取出批数据, x[i:i+batch_n]会取出从第i个到第i+batch_n个之间的数据.\n",
    "    # x[0:100]、x[100:200]\n",
    "    x_batch = x[i:i+batch_size]\n",
    "    y_batch = predict(network, x_batch)\n",
    "    # argmax()获取值最大的元素的索引, axis=1这指定了在100*10的数组中沿着第1维方向(以第1维为轴)找到值最大的元素的索引(第0维对应第1个维度)\n",
    "    p = np.argmax(y_batch, axis=1) \n",
    "    accuracy_cnt += np.sum(p == t[i:i+batch_size])\n",
    "\n",
    "print(\"Accuracy\" + str(float(accuracy_cnt) / len(x)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bbd16555-c79a-4a1b-a78b-41e837c50907",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
